/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package frontera.interfaz;

import control.AdministrarPermisos;
import control.SIRHApp;
import control.accion.Atras;
import control.comparaciones.Comparacion;
import control.comportamiento.ComportamientoLista;
import control.comportamiento.ComportamientoListaBusqueda;
import control.comportamiento.EscucharBusqueda;
import control.filtros.Filtro;
import control.filtros.FiltroPrestacionesNombre;
import control.filtros.FiltroPrestacionesPorcentajeCompania;
import control.filtros.FiltroPrestacionesPorcentajeEmpleado;
import control.filtros.FiltroUsuarioEmpleado;
import control.filtros.FiltroUsuarioNombre;
import entidad.Candidato;
import entidad.Cargo;
import entidad.Empleado;
import entidad.Prestacion;
import entidad.Usuario;
import frontera.interfaz.listRenderer.ListRendererCandidato;
import frontera.interfaz.listRenderer.ListRendererCargos;
import frontera.interfaz.listRenderer.ListRendererEmpleados;
import frontera.interfaz.listRenderer.ListRendererPrestacion;
import frontera.interfaz.listRenderer.ListRendererUsuarios;
import frontera.interfaz.panel.PanelBusqueda;
import frontera.interfaz.panel.PanelInicio;
import frontera.interfaz.panel.PanelModificarCandidato;
import frontera.interfaz.panel.PanelModificarCargo;
import frontera.interfaz.panel.PanelModificarEmpleado;
import frontera.interfaz.panel.PanelModificarPrestacion;
import frontera.interfaz.panel.PanelModificarUsuario;
import frontera.interfaz.panel.PanelNomina;
import frontera.interfaz.panel.herramientas.Busqueda;
import frontera.interfaz.panel.herramientas.PanelHerramientasBuscarBotones;
import frontera.interfaz.panel.resultados.PanelResultadosLista;
import frontera.interfaz.panel.resultados.PanelResultadosSeleccion;
import java.awt.Container;
import java.util.ArrayList;
import javax.swing.Action;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

/**
 *
 * @author tuareg
 */
public class InterfazFactory {

    public InterfazFactory() {
        this.admPermisos = SIRHApp.getInstance().getAdmPermisos();
    }

    private Pestana buildPestanaInicio() {
        pestanaInicio = new javax.swing.JPanel();
        pestanaInicio.setLayout(new java.awt.GridLayout(1, 0));
        pestanaInicio.add(buildPanelInicio());
        return new Pestana(pestanaInicio, "Inicio", new javax.swing.ImageIcon(getClass().getResource("/frontera/recursos/Home.png")));
    }

    private Pestana buildPestanaPersonal() {
        if (admPermisos.permisoEmpleados() || admPermisos.permisoCargos()) {
            panelPersonalCargos = new javax.swing.JPanel();
            scrollPaneEmpleados = new javax.swing.JScrollPane();
            scrollPaneEmpleados.getVerticalScrollBar().setUnitIncrement(16);
            panelPersonalEmpleados = new javax.swing.JPanel();
            pestanasIntPersonal = new javax.swing.JTabbedPane();
            pestanaPersonal = new javax.swing.JPanel();
            pestanaPersonal.setLayout(new java.awt.GridLayout(1, 0));

            pestanasIntPersonal.setTabPlacement(javax.swing.JTabbedPane.LEFT);
            pestanasIntPersonal.setFont(new java.awt.Font("Dialog", 1, 18));


            if (admPermisos.permisoEmpleados()) {
                panelPersonalEmpleados.setLayout(new java.awt.GridLayout(1, 0));
                panelPersonalEmpleados.add(buildPanelEmpleados());
                scrollPaneEmpleados.setViewportView(panelPersonalEmpleados);

                pestanasIntPersonal.addTab("Empleados", scrollPaneEmpleados);
            }

            if (admPermisos.permisoCargos()) {

                panelPersonalCargos.setLayout(new java.awt.GridLayout(1, 0));
                panelPersonalCargos.add(buildPanelCargos());
                pestanasIntPersonal.addTab("Cargos", panelPersonalCargos);

            }
            pestanaPersonal.add(pestanasIntPersonal);
            return new Pestana(pestanaPersonal, "Personal", new javax.swing.ImageIcon(getClass().getResource("/frontera/recursos/Account.png")));

        } else {
            return null;
        }




    }

    private Pestana buildPestanaNomina() {
        if (admPermisos.permisoPrestaciones() || admPermisos.permisoReportes()) {
            pestanaNomina = new javax.swing.JPanel();
            panelNominaPrincipal = new javax.swing.JTabbedPane();
            panelNominaReportes = new javax.swing.JPanel();
            panelNominaPrestaciones = new javax.swing.JPanel();
            pestanaNomina.setLayout(new java.awt.GridLayout(1, 0));

            panelNominaPrincipal.setTabPlacement(javax.swing.JTabbedPane.LEFT);
            panelNominaPrincipal.setFont(new java.awt.Font("Dialog", 1, 18));

            if (admPermisos.permisoReportes()) {
                panelNominaReportes.setLayout(new java.awt.GridLayout(1, 0));
                panelNominaReportes.add(buildPanelReportes());
                panelNominaPrincipal.addTab("Reportes", panelNominaReportes);
            }
            if (admPermisos.permisoPrestaciones()) {
                panelNominaPrestaciones.setLayout(new java.awt.GridLayout(1, 0));
                panelNominaPrestaciones.add(buildPanelPrestaciones());
                panelNominaPrincipal.addTab("Prestaciones", panelNominaPrestaciones);
            }

            pestanaNomina.add(panelNominaPrincipal);

            return new Pestana(pestanaNomina, "Nómina", new javax.swing.ImageIcon(getClass().getResource("/frontera/recursos/InvoiceSmall.png")));
        } else {
            return null;
        }


    }

    private Pestana buildPestanaReclutamiento() {
        if (admPermisos.permisoCandidatos()) {
            pestanaReclutamiento = new javax.swing.JPanel();
            panelReclutamientoPrincipal = new javax.swing.JPanel();
            pestanaReclutamiento.setLayout(new java.awt.GridLayout(1, 0));
            panelReclutamientoPrincipal.setLayout(new java.awt.GridLayout(1, 0));
            panelReclutamientoPrincipal.add(buildPanelCandidatos());
            pestanaReclutamiento.add(panelReclutamientoPrincipal);
            return new Pestana(pestanaReclutamiento, "Reclutamiento", new javax.swing.ImageIcon(getClass().getResource("/frontera/recursos/Account Alt.png")));
        } else {
            return null;
        }

    }

    private Pestana buildPestanaUsuarios() {
        if (admPermisos.permisoUsuarios()) {
            pestanaUsuarios = new javax.swing.JPanel();
            panelUsuariosPrincipal = new javax.swing.JPanel();
            pestanaUsuarios.setLayout(new java.awt.GridLayout(1, 0));
            panelUsuariosPrincipal.setLayout(new java.awt.GridLayout(1, 0));
            pestanaUsuarios.add(panelUsuariosPrincipal);
            panelUsuariosPrincipal.add(buildPanelUsuarios());
            return new Pestana(pestanaUsuarios, "Usuarios", new javax.swing.ImageIcon(getClass().getResource("/frontera/recursos/ManageUsers.png")));
        } else {
            return null;
        }
    }

    public ArrayList<Pestana> getPestanasPrincipal() {
        Pestana tmp;
        //Construye cada pestaña apoyandose en el administrador de permisos
        ArrayList<Pestana> pestanas = new ArrayList<Pestana>();
        //Construir pestaña de inicio
        pestanas.add(buildPestanaInicio());
        //Construir pestaña de personal
        tmp = buildPestanaPersonal();
        if (tmp != null) {
            pestanas.add(tmp);
        }
        tmp = buildPestanaReclutamiento();
        if (tmp != null) {
            pestanas.add(tmp);
        }
        tmp = buildPestanaNomina();
        if (tmp != null) {
            pestanas.add(tmp);
        }
        tmp = buildPestanaUsuarios();
        if (tmp != null) {
            pestanas.add(tmp);
        }
        return pestanas;
    }

    private PanelBusqueda<Empleado> buildPanelEmpleados() {
        if (panelEmpleados == null) {
            //Genera el panel de búsqueda de empleados.
            panelEmpleados = new PanelBusqueda<Empleado>(
                    new PanelResultadosLista<Empleado>(
                    SIRHApp.getInstance().getSistema().getEmpleados(),
                    new ListRendererEmpleados()),
                    new ComportamientoLista<Empleado>() {

                        public void dobleClick(Empleado objeto) {
                            SIRHApp.getInstance().getVentanaPrincipal().
                                    setPanelPersonalEmpleado(
                                    new PanelModificarEmpleado(objeto));
                        }
                    });
            //Pedimos al administrador de permisos el array de acciones permitidos para este usuario
            Tupla<ArrayList<Action>, ArrayList<PanelResultadosSeleccion<Empleado>>> acciones = admPermisos.getAccionesEmpleado();
            //Añadimos el panel de herramientas con los botones permitidos
            panelEmpleados.setPanelHerramientas(new PanelHerramientasBuscarBotones<Empleado>(
                    panelEmpleados,
                    SIRHApp.getInstance().getFiltrosEmpleados(),
                    new Busqueda<Empleado>() {

                        public ArrayList<Empleado> buscar(Filtro<Empleado> tipoFiltro, Comparacion comparacion, String filtro) {
                            return SIRHApp.getInstance().getAdmEmpleados().buscar(tipoFiltro, comparacion, filtro);
                        }
                    },
                    acciones.getA(),
                    acciones.getB()));
        }
        return panelEmpleados;

    }

    private PanelBusqueda<Cargo> buildPanelCargos() {
        if (panelCargos == null) {
            panelCargos = new PanelBusqueda<Cargo>(
                    new PanelResultadosLista<Cargo>(
                    SIRHApp.getInstance().getSistema().getCargos(),
                    new ListRendererCargos()),
                    new ComportamientoLista<Cargo>() {

                        public void dobleClick(Cargo objeto) {
                            SIRHApp.getInstance().getVentanaPrincipal().
                                    setPanelPersonalCargo(
                                    new PanelModificarCargo(objeto));
                        }
                    });
            //Pedimos al administrador de permisos el array de acciones permitidos para este usuario para Cargos
            Tupla<ArrayList<Action>, ArrayList<PanelResultadosSeleccion<Cargo>>> acciones = admPermisos.getAccionesCargos(panelCargos);
            //Añadimos el panel de herramientas con los botones permitidos
            panelCargos.setPanelHerramientas(
                    new PanelHerramientasBuscarBotones<Cargo>(
                    panelCargos,
                    SIRHApp.getInstance().getFiltrosCargos(),
                    new Busqueda<Cargo>() {

                        public ArrayList<Cargo> buscar(Filtro<Cargo> tipoFiltro, Comparacion comparacion, String filtro) {
                            return SIRHApp.getInstance().getAdmCargos().buscar(tipoFiltro, comparacion, filtro);
                        }
                    },
                    acciones.getA(),
                    acciones.getB()));
        }

        return panelCargos;

    }

    private PanelBusqueda<Candidato> buildPanelCandidatos() {
        if (panelCandidatos == null) {
            panelCandidatos = new PanelBusqueda<Candidato>(
                    new PanelResultadosLista<Candidato>(
                    SIRHApp.getInstance().getSistema().getCandidatos(),
                    new ListRendererCandidato()),
                    new ComportamientoLista<Candidato>() {

                        public void dobleClick(Candidato objeto) {
                            SIRHApp.getInstance().getVentanaPrincipal().
                                    setPanelReclutamientoPrincipal(
                                    new PanelModificarCandidato(objeto));
                        }
                    });
            //Pedimos al administrador de permisos el array de acciones permitidos para este usuario para Cargos
            Tupla<ArrayList<Action>, ArrayList<PanelResultadosSeleccion<Candidato>>> acciones = admPermisos.getAccionesCandidatos(panelCandidatos);
            //Añadimos el panel de herramientas con los botones permitidos
            panelCandidatos.setPanelHerramientas(
                    new PanelHerramientasBuscarBotones<Candidato>(
                    panelCandidatos,
                    SIRHApp.getInstance().getFiltrosCandidatos(),
                    new Busqueda<Candidato>() {

                        public ArrayList<Candidato> buscar(Filtro<Candidato> tipoFiltro, Comparacion comparacion, String filtro) {
                            return SIRHApp.getInstance().getAdmCandidatos().buscar(tipoFiltro, comparacion, filtro);
                        }
                    },
                    acciones.getA(),
                    acciones.getB()));
        }
        return panelCandidatos;

    }

    private PanelBusqueda<Usuario> buildPanelUsuarios() {
        if (panelUsuarios == null) {
            panelUsuarios = new PanelBusqueda<Usuario>(
                    new PanelResultadosLista<Usuario>(
                    SIRHApp.getInstance().getSistema().getUsuarios(),
                    new ListRendererUsuarios()),
                    new ComportamientoLista<Usuario>() {

                        public void dobleClick(Usuario objeto) {
                            SIRHApp.getInstance().getVentanaPrincipal().
                                    setPanelUsuariosPrincipal(
                                    new PanelModificarUsuario(objeto));
                        }
                    });

            ArrayList<Filtro<Usuario>> filtros = new ArrayList<Filtro<Usuario>>();
            filtros.add(new FiltroUsuarioEmpleado());
            filtros.add(new FiltroUsuarioNombre());
            //Pedimos al administrador de permisos el array de acciones permitidos para este usuario para Cargos
            Tupla<ArrayList<Action>, ArrayList<PanelResultadosSeleccion<Usuario>>> acciones = admPermisos.getAccionesUsuarios(panelUsuarios);
            //Añadimos el panel de herramientas con los botones permitidos
            panelUsuarios.setPanelHerramientas(
                    new PanelHerramientasBuscarBotones<Usuario>(
                    panelUsuarios,
                    filtros,
                    new Busqueda<Usuario>() {

                        public ArrayList<Usuario> buscar(Filtro<Usuario> tipoFiltro, Comparacion comparacion, String filtro) {
                            return SIRHApp.getInstance().getAdmUsuarios().buscar(tipoFiltro, comparacion, filtro);
                        }
                    },
                    acciones.getA(),
                    acciones.getB()));
        }
        return panelUsuarios;

    }

    private PanelBusqueda<Prestacion> buildPanelPrestaciones() {
        if (panelPrestaciones == null) {
            panelPrestaciones = new PanelBusqueda<Prestacion>(
                    new PanelResultadosLista<Prestacion>(
                    SIRHApp.getInstance().getSistema().getPrestaciones(),
                    new ListRendererPrestacion()),
                    new ComportamientoLista<Prestacion>() {

                        public void dobleClick(Prestacion objeto) {
                            SIRHApp.getInstance().getVentanaPrincipal().
                                    setPanelNominaPrestaciones(
                                    new PanelModificarPrestacion(objeto));
                        }
                    });
            //Pedimos al administrador de permisos el array de acciones permitidos para este usuario para Cargos
            Tupla<ArrayList<Action>, ArrayList<PanelResultadosSeleccion<Prestacion>>> acciones = admPermisos.getAccionesPrestaciones(panelPrestaciones);
            //Construimos el array de filtros
            ArrayList<Filtro<Prestacion>> filtros = new ArrayList<Filtro<Prestacion>>();
            filtros.add(new FiltroPrestacionesNombre());
            filtros.add(new FiltroPrestacionesPorcentajeEmpleado());
	    filtros.add(new FiltroPrestacionesPorcentajeCompania());


            //Añadimos el panel de herramientas con los botones permitidos
            panelPrestaciones.setPanelHerramientas(
                    new PanelHerramientasBuscarBotones<Prestacion>(
                    panelPrestaciones,
                    filtros,
                    new Busqueda<Prestacion>() {

                        public ArrayList<Prestacion> buscar(Filtro<Prestacion> tipoFiltro, Comparacion comparacion, String filtro) {
                            return SIRHApp.getInstance().getAdmPrestaciones().buscar(tipoFiltro, comparacion, filtro);
                        }
                    },
                    acciones.getA(),
                    acciones.getB()));
        }
        return panelPrestaciones;

    }

    private JPanel buildPanelReportes() {
        if (panelNomina == null) {
            panelNomina = new PanelNomina();
        }
        return panelNomina;
    }

    private JPanel buildPanelInicio() {
        //TODO : COnstruya el panel de inicio según los permisos del usuario actual

        return new PanelInicio();
    }

    public PanelBusqueda<Cargo> getPanelCargos() {
        return panelCargos;
    }

    public PanelBusqueda<Empleado> getPanelEmpleados() {
        return panelEmpleados;
    }

    public PanelBusqueda<Prestacion> getPanelPrestaciones() {
        return panelPrestaciones;
    }

    public JPanel getPanelReportes() {
        return panelNominaReportes;
    }

    public PanelBusqueda<Usuario> getPanelUsuarios() {
        return panelUsuarios;
    }

    public PanelBusqueda<Candidato> getPanelCandidatos() {
        return panelCandidatos;
    }

    public JPanel getPanelInicio() {
        return pestanaInicio;
    }

    public JTabbedPane getPestanasIntPersonal() {
        return pestanasIntPersonal;
    }

    public JTabbedPane getPanelNominaPrincipal() {
        return panelNominaPrincipal;
    }

    public JPanel getPestanaNomina() {
        return pestanaNomina;
    }

    public JPanel getPestanaPersonal() {
        return pestanaPersonal;
    }

    public JPanel getPestanaReclutamiento() {
        return pestanaReclutamiento;
    }

    public JPanel getPestanaUsuarios() {
        return pestanaUsuarios;
    }

    public void setPanelReclutamientoPrincipal(JPanel contenido) {
        setPanel(panelReclutamientoPrincipal, contenido);
    }

    public void setPanelNominaPrestaciones(JPanel contenido) {
        setPanel(panelNominaPrestaciones, contenido);
    }

    public void setPanelPersonalEmpleado(JPanel contenido) {
        setPanel(panelPersonalEmpleados, contenido);
    }

    public void setPanelPersonalCargo(JPanel contenido) {
        setPanel(panelPersonalCargos, contenido);
    }

    public void setPanelUsuariosPrincipal(JPanel contenido) {
        setPanel(panelUsuariosPrincipal, contenido);
    }

    public void setPanelInicio(JPanel contenido) {
        setPanel(pestanaInicio, contenido);
    }

    private void setPanel(JPanel contenedor, JPanel contenido) {
        contenedor.setVisible(false);
        contenedor.removeAll();
        contenedor.add(contenido);
        contenedor.setVisible(true);
    }

    public PanelBusqueda<Cargo> getPanelBusquedaCargo(EscucharBusqueda listener, JPanel aDondeVolver, Container enDondeVolver, ArrayList<Cargo> cargosAMostrar) {
        PanelBusqueda<Cargo> panelBusquedaCargo =
                new PanelBusqueda<Cargo>(
                new PanelResultadosLista<Cargo>(
                cargosAMostrar,
                new ListRendererCargos()),
                new ComportamientoListaBusqueda<Cargo>(listener));
        ArrayList<Action> acciones = new ArrayList<Action>();
        acciones.add(new Atras(aDondeVolver, enDondeVolver));
        panelBusquedaCargo.setPanelHerramientas(
                new PanelHerramientasBuscarBotones<Cargo>(
                panelBusquedaCargo,
                SIRHApp.getInstance().getFiltrosCargos(),
                new Busqueda() {

                    public ArrayList buscar(Filtro tipoFiltro, Comparacion comparacion, String filtro) {
                        return SIRHApp.getInstance().getAdmCargos().buscar(tipoFiltro, comparacion, filtro);
                    }
                },
                acciones,
                new ArrayList<PanelResultadosSeleccion<Cargo>>()));
        return panelBusquedaCargo;
    }
    private PanelBusqueda<Prestacion> panelPrestaciones = null;
    private PanelBusqueda<Empleado> panelEmpleados = null;
    private PanelBusqueda<Candidato> panelCandidatos = null;
    private PanelBusqueda<Cargo> panelCargos = null;
    private PanelBusqueda<Usuario> panelUsuarios = null;
    private PanelNomina panelNomina = null;
    private javax.swing.JPanel panelNominaPrestaciones;
    private javax.swing.JTabbedPane panelNominaPrincipal;
    private javax.swing.JPanel panelNominaReportes;
    private javax.swing.JPanel panelPersonalCargos;
    private javax.swing.JPanel panelPersonalEmpleados;
    private javax.swing.JPanel panelReclutamientoPrincipal;
    private javax.swing.JPanel panelUsuariosPrincipal;
    private javax.swing.JPanel pestanaInicio;
    private javax.swing.JPanel pestanaNomina;
    private javax.swing.JPanel pestanaPersonal;
    private javax.swing.JPanel pestanaReclutamiento;
    private javax.swing.JPanel pestanaUsuarios;
    private javax.swing.JTabbedPane pestanasIntPersonal;
    private javax.swing.JScrollPane scrollPaneEmpleados;
    private AdministrarPermisos admPermisos;
}
